package com.study.c2;

import java.util.Arrays;

public class CipherUtils
{
    /**
     * 加密数字密码
     * 加密规则：每位数加上5 -> 再对10求余 -> 最后将所有数字反转
     *
     * @param numPwd 需要加密的数字密码
     */
    static int encrypt(int numPwd)
    {
        // 把数字密码拆分成数字数组
        int[] digits = splitNumberIntoDigits(numPwd);
        // + 5
        for (int i = 0; i < digits.length; i++) {
            digits[i] += 5;
        }
        System.out.println(Arrays.toString(digits));
        // % 10
        for (int i = 0; i < digits.length; i++) {
            digits[i] %= 10;
        }
        System.out.println(Arrays.toString(digits));
        // reverse
        reverse(digits);
        // 合并成数字
        return mergeDigitsToNumber(digits);
    }

    /**
     * 解密数字密码
     */
    static int decrypt(int encryptedPwd)
    {
        // 把数字密码拆分成数字数组
        int[] digits = splitNumberIntoDigits(encryptedPwd);
        // reverse
        reverse(digits);
        // 逆 % 10
        for (int i = 0; i < digits.length; i++) {
            // 小的是小的十位数对十取余得来的
            if (digits[i] >= 0 && digits[i] <= 4) {
                digits[i] += 10;
            }
        }
        System.out.println(Arrays.toString(digits));
        // - 5
        for (int i = 0; i < digits.length; i++) {
            digits[i] -= 5;
        }
        System.out.println(Arrays.toString(digits));
        // 合并成数字
        return mergeDigitsToNumber(digits);
    }

    static int[] splitNumberIntoDigits(int number)
    {
        int tmpNumber = number;
        int count = 0;
        while (tmpNumber > 0) {
            tmpNumber /= 10;
            count++;
        }
        int[] digits = new int[count];
        int index = digits.length - 1;
        while (number > 0) {
            digits[index--] = number % 10;
            number /= 10;
        }
        return digits;
    }

    private static int mergeDigitsToNumber(int[] digits)
    {
        int number = 0;
        for (int digit : digits) {
            number = number * 10 + digit;
        }
        return number;
    }

    private static void reverse(int[] arr)
    {
        for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        System.out.println(Arrays.toString(arr));
    }
}
